package br.com.sistema.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import br.com.sistema.conexao.Entity;
import br.com.sistema.models.Estado;
import br.com.sistema.models.Pais;

public class EstadoDao implements IDao<Estado> {

	@Override
	public Estado getById(int id) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	@Override
	public List<Estado> getByCriteria(Estado o) throws Exception {
		
		try {
			
			EntityManager em = Entity.createEm();
			List<Estado> list;
			
			try {
				
				CriteriaBuilder cb = em.getCriteriaBuilder();
				CriteriaQuery c = cb.createQuery(Estado.class);
				Root<Estado> a = c.from(Estado.class);
				c.select(a);

				List<Predicate> predicates = new ArrayList<Predicate>();
				
				if(o.getPais() != null){
					predicates.add(cb.equal(a.<Pais>get("pais"), o.getPais()));
				}
				
				if(o.getEstanome() != null){
					predicates.add(cb.like(a.<String>get("estanome"), "%"+o.getEstanome()+"%"));
				}
				
				if(o.getEstacodnum() != null){
					predicates.add(cb.like(a.<String>get("estacodnum"), "%"+o.getEstacodnum()+"%"));
				}
				
				c.where(cb.and(predicates.toArray(new Predicate[]{})));
				
				TypedQuery<Estado> query = em.createQuery(c);
				list = query.getResultList();
				
				return list;
				
			} catch (Exception e) {
				throw e;
			}finally{
				em.close();
			}
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public void remove(List<Estado> list) throws Exception {
		try {
			EntityManager em = Entity.createEm();
			try {
				em.getTransaction().begin();
				for(Estado p : list){
					Estado i = em.find(Estado.class, p.getEstaid());
					em.remove(i);
				}
				em.getTransaction().commit();
			} catch (Exception e) {
				if(em.getTransaction().isActive()){
					em.getTransaction().rollback();
				}
				throw e;
			}finally{
				em.close();
			}
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public List<Estado> getAll() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Estado manter(Estado o) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Estado insere(Estado o) throws Exception {
		try {
			EntityManager em = Entity.createEm();
			try {
				em.getTransaction().begin();
				em.persist(o);
				em.getTransaction().commit();
				return o;
			} catch (Exception e) {
				if(em.getTransaction().isActive()){
					em.getTransaction().rollback();
				}
				throw e;
			}finally{
				em.close();
			}
		} catch (Exception e) {
			throw e;
		}
	}

	@Override
	public Estado altera(Estado o) throws Exception {
		try {
			
			EntityManager em = Entity.createEm();
			Estado estado = em.find(Estado.class, o.getEstaid());
			
			try {
				
				em.getTransaction().begin();
				estado.setPais(o.getPais());
				estado.setEstanome(o.getEstanome());
				estado.setEstacodnum(o.getEstacodnum());
				estado.setEstaalf2(o.getEstaalf2());
				estado.setXusuario(o.getXusuario());
				em.persist(estado);
				em.getTransaction().commit();
				
				return estado;
				
			} catch (Exception e) {
				
				if(em.getTransaction().isActive()){
					em.getTransaction().rollback();
				}
				
				throw e;
				
			}finally{
				em.close();
			}
		} catch (Exception e) {
			throw e;
		}
	}
	
	
}
